# 机械学习1.7 第一个应用 鸢尾花分类

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn

from sklearn.datasets import load_iris
iris_dataset = load_iris()
# print("花的品种:{}".format(iris_dataset['target_names']))

# 对数据调用train_test_split
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)

# print("X_train的形状shape:{}".format(X_train.shape))
# print("y_train的shape:{}".format(y_train.shape))
#
# print("X_test的形状shape:{}".format(X_test.shape))
# print("y_train shape:{}".format(y_test.shape))
#
# # 可视化观察数据
#
# # 利用X_train中的数据创建DataFrame,iris_dataset.feature_names的字符串对数据列进行标记
# iris_dataset = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
# # DataFrame创建散点图矩阵 按照y_train着色
# grr = pd.plotting.scatter_matrix(iris_dataset, c=y_train, figsize=(15, 15), marker='0',
#                                  hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)
# plt.show()

# k近邻分类器
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
# X_new = np.array([[5, 2.9, 1, 0.2]])
# print("X_new.shape:{}".format(X_new.shape)) # scikit-learn的输入数据为二维数组
# prediction = knn.predict(X_new) # 根据二维数组做出预测
# print("预测结果:{}".format(prediction))
# print("预测品种:{}".format(iris_dataset['target_names'][prediction])) # 输出预测到的结果

# 评估模型
y_pred = knn.predict(X_test) # 对测试集做出预测
# print("测试集预测：{}".format(y_pred))
print("测试集分数为: {:.2f}".format(np.mean(y_pred==y_test))) # np的mean函数 可以对两个数组对比，相同为true不同为false，可以直接得到相同的比率

# 第一章 鸢尾花分类完成
# 从sklearn库中的鸢尾花数据集中调出并查看数据集，包含测试集test和训练集train，其中数据设为了X，标签则是y。
# 随后对数据进行了可视化使用了matplotlib进行绘图，将数据x_train按照y_train来着色进行直观可视化。
# 最后进行预测，通过k近邻分类器knn.fit()函数进行训练再通过knn.predict()函数进行预测，最后通过numpy的np.mean()函数完成对两个数组准确率的对比